package com.cyou.qb.face.util.converter;
/**
 * 将Object转换成json串的工具类
 * 解析对象的类型将其拼接成json格式的字符串
 * @author wangwenlong
 * 
 */

import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class ObjectToJson {
	
	/**
	 * 将对象转成json
	 * @param obj
	 * @return String
	 */
	public static String object2json(Object obj){
		
		StringBuilder json = new StringBuilder();
		
		if(obj == null){
			json.append("\"\"");
		}else if(obj instanceof String || obj instanceof Integer
					|| obj instanceof Float || obj instanceof Boolean
					|| obj instanceof Short || obj instanceof Double
					|| obj instanceof Long || obj instanceof BigDecimal
					|| obj instanceof BigInteger || obj instanceof Byte){
			json.append("\"").append(string2json(obj.toString())).append("\"");
		}else if(obj instanceof Object[]){
			json.append(array2json((Object[])obj));
		}else if(obj instanceof List<?>){
			json.append(list2json((List<?>)obj));
		}else if(obj instanceof Map<?,?>){
			json.append(map2json((Map<?,?>)obj));
		}else if(obj instanceof Set<?>){
			json.append(set2json((Set<?>)obj));
		}else{
			json.append(bean2json(obj));
		}
		return json.toString();		
	}
	/**
	 * 若此对象是字符串则进行string2json处理
	 * @param str
	 * @return String
	 */
	public static String string2json(String str){
		
		if(str == null){
			return "";
		}
		StringBuilder strb = new StringBuilder();
		for(int i=0;i<str.length();i++){
			char ch = str.charAt(i);
			switch(ch){
			case '"':
				strb.append("\"");
				break;
			case '\\':
				strb.append("\\");
				break;
			case '\b':
				strb.append("\\b");
				break;
			case '\f':
				strb.append("\\f");
				break;
			case '\n':
				strb.append("\\n");
				break;
			case '\r':
				strb.append("\\r");
				break;
			case '\t':
				strb.append("\\t");
				break;
			case '/':
				strb.append("/");
				break;
			default:
				if(ch >= '\u0000' && ch<= '\u001F'){
					String ss = Integer.toHexString(ch);
					strb.append("\\u");
					for(int k=0;k<4-ss.length();k++){
						strb.append('0');
					}
					strb.append(ss.toUpperCase());
				}else{
					strb.append(ch);
				}
			}
		}
		return strb.toString();		
	}
	/**
	 * 若此对象是个List则对List进行list2json处理
	 * @param list
	 * @return String
	 */
	public static String list2json(List<?> list){
		StringBuilder json = new StringBuilder();
		json.append("[");
		if(list !=null&& list.size()>0){
			for(Object obj : list){
				json.append(object2json(obj));
				json.append(",");
			}
			json.setCharAt(json.length()-1, ']');
		}else{
			json.append(']');
		}
		return json.toString();
	}
	/**
	 * 若此对象是个javabean则对其进行bean2json处理
	 * @param bean
	 * @return String
	 */
	public static String bean2json(Object bean){
		StringBuilder json = new StringBuilder();
		json.append("{");
		PropertyDescriptor[] props = null;   //描述 Java Bean 通过一对存储器方法导出的一个属性
		try{
			/*
			 * 分析bean并扫描bean内部的所有public属性、方法和事件
			 * 并将其放入到PropertyDescriptor数组中
			 * PropertyDescriptor数组是用来将bean的get和set方法进行解析获取其bean的值
			 */
			props = Introspector.getBeanInfo(bean.getClass(),Object.class).getPropertyDescriptors();
			
		}catch(IntrospectionException e){
			
		}
		if(props != null){
			for(int i=0;i<props.length;i++){
				try{
					String name = object2json(props[i].getName());
					String value = object2json(props[i].getReadMethod().invoke(bean));//获得应该用于读取属性值的方法并调用
					json.append(name);
					json.append(":");
					json.append(value);
					json.append(",");
				}catch(Exception e){}
			}
			json.setCharAt(json.length()-1, '}');
		}else{
			json.append("}");
		}
		return json.toString();
	}
	/**
	 * 若此对象是Array数组则进行array2json处理
	 * @param array
	 * @return String
	 */
	public static String array2json(Object[] array){
		StringBuilder json = new StringBuilder();
		json.append("[");
		if(array != null && array.length>0){
			for(Object obj : array){
				json.append(object2json(obj));
				json.append(",");
			}
			json.setCharAt(json.length()-1,']');
		}else{
			json.append("]");
		}
		return json.toString();
	}
	/**
	 * 若此对象是Map则进行map2json处理
	 * @param map
	 * @return String
	 */ 
	public static String map2json(Map<?,?> map){
		StringBuilder json = new StringBuilder();
		
		json.append("{");
		if(map != null && map.size()>0){
			for(Object key : map.keySet()){
				json.append(object2json(key));
				json.append(":");
				json.append(object2json(map.get(key)));
				json.append(",");
			}
			json.append("}");
		}
		return json.toString();
	}
	/**
	 * 若此对象是Set则进行set2json处理
	 * @param set
	 * @return String
	 */
	public static String set2json(Set<?> set){
		StringBuilder json = new StringBuilder();
		json.append("[");
		if(set != null && set.size()>0){
			for(Object obj :set){
				json.append(object2json(obj));
				json.append(",");
			}
			json.setCharAt(json.length()-1, ']');
		}else{
			json.append("]");
		}
		return json.toString();
	}
}
